home *** CD-ROM | disk | FTP | other *** search
- /*
- * SFtoSpr - Star Fighter 3000 graphics converter
- * Savebox for SF3000 MapTiles file
- * Copyright (C) 2000 Chris Bazley
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public Licence as published by
- * the Free Software Foundation; either version 2 of the Licence, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public Licence for more details.
- *
- * You should have received a copy of the GNU General Public Licence
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
- /* ANSI library files */
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdbool.h>
-
- /* RISC OS library files */
- #include "wimp.h"
- #include "toolbox.h"
- #include "event.h"
- #include "wimplib.h"
- #include "saveas.h"
- #include "window.h"
- #include "gadgets.h"
- #include "flex.h"
-
- /* My library files */
- #include "err.h"
- #include "msgtrans.h"
- #include "hourglass.h"
- #include "FilePerc.h"
- #include "ViewsMenu.h"
- #include "Macros.h"
- #include "TboxBugs.h"
-
- /* Local headers */
- #include "SFformats.h"
- #include "SprFormats.h"
- #include "Utils.h"
- #include "Loader.h"
- #include "Main.h"
- #include "SaveMapTiles.h"
-
- /* Gadget IDs */
- #define SPRTOTEX_SP1 0x0c
- #define SPRTOTEX_SP2 0x10
- #define SPRTOTEX_TR 0x00
- #define SPRTOTEX_TRB 0x100
- #define SPRTOTEX_MAXNUM 0x116
-
- typedef struct _SaveMapTilesData
- {
- ObjectId saveas_id;
- ObjectId window_id;
- char *reset_file_name;
- SF_MapTilesSetHdr *tiles_data; /* flex block */
- } SaveMapTilesData;
-
- /* -----------------------------------------------------------------------
- * Function prototypes
- */
-
- static ToolboxEventHandler _SaveMapTiles_bumphandler, _SaveMapTiles_savehandler, _SaveMapTiles_buttonshandler, _SaveMapTiles_deletedhandler;
- static LoaderFinishedHandler _SaveMapTiles_animsloaded;
- static _kernel_oserror *_SaveMapTiles_read_anims(ObjectId win, SF_MapTilesSetHdr **hdr);
- static _kernel_oserror *_SaveMapTiles_write_anims(ObjectId win, SF_MapTilesSetHdr **hdr);
-
- /* -----------------------------------------------------------------------
- * Public functions
- */
-
- ObjectId SaveMapTiles_create(char *savepath, int data_saved, SF_MapTilesSetHdr **tiles_data)
- {
- /* Must either RE-ANCHOR tiles_data or flex_free() it
- (will only be flex_free'd if we return NULL_ObjectId) */
- SaveMapTilesData *newblk;
- char *views_path;
-
- /* Grab memory */
- newblk = malloc(sizeof(SaveMapTilesData));
- if(newblk == NULL)
- MG_RETV("NoMem", NULL_ObjectId) /* failure */
-
- newblk->reset_file_name = NULL;
-
- /* Create object */
- if(E(toolbox_create_object(0, "SprToTex", &newblk->saveas_id)))
- goto errexit_free;
- if(E(saveas_get_window_id(0, newblk->saveas_id, &newblk->window_id)))
- goto errexit_delete;
-
- /* Store default settings */
- if((newblk->reset_file_name = copystring(savepath)) == NULL)
- goto errexit_delete;
-
- /* Add entry to iconbar menu */
- if(data_saved)
- views_path = savepath; /* we have real filepath */
- else
- views_path = ""; /* dummy filepath */
- if(E(ViewsMenu_add(newblk->saveas_id, msgs_lookup_sub1("SprTexList", tail(savepath, 3)), views_path)))
- goto errexit_delete;
-
- /* Set up window */
- if(E(saveas_set_file_name(0, newblk->saveas_id, savepath))
- || E(saveas_set_file_type(0, newblk->saveas_id, FILETYPE_MAPTILES))
- || E(saveas_set_file_size(0, newblk->saveas_id, flex_size((flex_ptr)tiles_data)))
- || E(numberrange_set_value(0, newblk->window_id, SPRTOTEX_MAXNUM, (*tiles_data)->lasttile_num))
- || E(_SaveMapTiles_write_anims(newblk->window_id, tiles_data)))
- goto errexit_menuremove;
-
- if(E(loader_register_listener(0, FILETYPE_TEXT, newblk->window_id, NULL, load_animations, _SaveMapTiles_animsloaded, newblk)))
- goto errexit_menuremove;
-
- /*
- Note the ObjectDeleted handler is registered AFTER anything that could cause an error and therefore premature deletion!
- */
- if(E(event_register_toolbox_handler(newblk->saveas_id, SaveAs_SaveToFile, _SaveMapTiles_savehandler, newblk))
- || E(event_register_toolbox_handler(newblk->saveas_id, SaveAs_DialogueCompleted, delete_object_handler, newblk))
- || E(event_register_toolbox_handler(newblk->window_id, ActionButton_Selected, _SaveMapTiles_buttonshandler, newblk))
- || E(event_register_toolbox_handler(newblk->window_id, NumberRange_ValueChanged, _SaveMapTiles_bumphandler, newblk))
- || E(event_register_toolbox_handler(newblk->saveas_id, Toolbox_ObjectDeleted, _SaveMapTiles_deletedhandler, newblk)))
- goto errexit_menuremove;
-
- flex_reanchor((flex_ptr)&newblk->tiles_data, (flex_ptr)tiles_data);
- return newblk->saveas_id; /* success */
-
- errexit_menuremove:
- RE(ViewsMenu_remove(newblk->saveas_id));
- errexit_delete:
- RE(toolbox_delete_object(0, newblk->saveas_id));
- errexit_free:
- free(newblk->reset_file_name);
- free(newblk);
- return NULL_ObjectId; /* failure */
- }
-
- /* -----------------------------------------------------------------------
- * Private functions
- */
-
- static _kernel_oserror *_SaveMapTiles_read_anims(ObjectId win, SF_MapTilesSetHdr **hdr)
- {
- for(int byte = 0; byte < 4; byte++) {
- int value;
- THROW(numberrange_get_value(0, win, SPRTOTEX_SP1 + byte, &value));
- (*hdr)->splash_anim_1[byte] = (char)value;
- THROW(numberrange_get_value(0, win, SPRTOTEX_SP2 + byte, &value));
- (*hdr)->splash_anim_2[byte] = (char)value;
- THROW(numberrange_get_value(0, win, SPRTOTEX_TR + byte, &value));
- (*hdr)->splash_2_triggers[byte] = (char)value;
- }
- return NULL; /* success */
- }
-
- /* ----------------------------------------------------------------------- */
-
- static _kernel_oserror *_SaveMapTiles_write_anims(ObjectId win, SF_MapTilesSetHdr **hdr)
- {
- for(int byte = 0; byte < 4; byte++) {
- int temp;
- THROW(numberrange_set_value(0, win, SPRTOTEX_SP1 + byte, (*hdr)->splash_anim_1[byte]));
- THROW(numberrange_set_value(0, win, SPRTOTEX_SP2 + byte, (*hdr)->splash_anim_2[byte]));
- temp = (*hdr)->splash_2_triggers[byte];
- THROW(numberrange_set_value(0, win, SPRTOTEX_TR + byte, temp));
- THROW(numberrange_set_value(0, win, SPRTOTEX_TRB + byte, temp + 1));
- }
- return NULL; /* success */
- }
-
- /*
- * Toolbox event handlers
- */
-
- static int _SaveMapTiles_bumphandler(int event_code, ToolboxEvent *event, IdBlock *id_block, void *handle)
- {
- /* NumberRange clicked on underlying window */
- NumberRangeValueChangedEvent *nrvce = (NumberRangeValueChangedEvent *)event;
-
- if(id_block->self_component < SPRTOTEX_TR
- || id_block->self_component > (SPRTOTEX_TR+3))
- return 0; /* bugger off if not 2nd splash triggers */
-
- /* Synchronise the second displayed number of this trigger pair */
- RE(numberrange_set_value(0, id_block->self_id, SPRTOTEX_TRB + (id_block->self_component - SPRTOTEX_TR), nrvce->new_value + 1));
-
- return 1; /* claim event */
- }
-
- /* ----------------------------------------------------------------------- */
-
- static int _SaveMapTiles_buttonshandler(int event_code, ToolboxEvent *event, IdBlock *id_block, void *handle)
- {
- /* ActionButton clicked on underlying window */
- ActionButtonSelectedEvent *abse = (ActionButtonSelectedEvent *)event;
- SaveMapTilesData *blk = (SaveMapTilesData *)handle;
-
- if(!FLAG_SET(abse->hdr.flags, ActionButton_Selected_Adjust))
- return 0; /* not interested */
-
- switch(id_block->self_component) {
- case 0x82bc02: /* Cancel button */
- /* Reset dbox state */
- if(blk->reset_file_name != NULL)
- RE(saveas_set_file_name(0, blk->saveas_id, blk->reset_file_name));
-
- RE(_SaveMapTiles_write_anims(id_block->self_id, &blk->tiles_data));
- break;
-
- #ifndef SAVEAS_CRAP /* no point saving state if dbox closes anyway */
- case 0x82bc03: /* Save button */
- /* Additional dbox state saving (animations data is read on save) */
- if(blk->animations != NULL)
- RE(optionbutton_get_state(0, id_block->self_id, TEXTOSPR_SAVEANIMS, &blk->reset_save_anims));
-
- int len;
- E_RETV(saveas_get_file_name(0, blk->saveas_id, NULL, 0, &len), 1)
- free(blk->reset_file_name);
- blk->reset_file_name = malloc(len+1);
- if(blk->reset_file_name == NULL)
- err_complain(255, msgs_global("NoMem"));
- else
- RE(saveas_get_file_name(0, blk->saveas_id, blk->reset_file_name, len, NULL));
- break;
- #endif
-
- default:
- return 0; /* unknown component */
- }
-
- return 1; /* claim event */
- }
-
- /* ----------------------------------------------------------------------- */
-
- static int _SaveMapTiles_savehandler(int event_code, ToolboxEvent *event, IdBlock *id_block, void *handle)
- {
- SaveAsSaveToFileEvent *save_to_file_block = (SaveAsSaveToFileEvent *)event;
- SaveMapTilesData *blk = (SaveMapTilesData *)handle;
- unsigned int flags = 0;
-
- /* Read displayed animations data into header
- N.B. This has the desired side effect of confirming the displayed
- animations for use if the dbox is reset (e.g. ADJUST-click 'Cancel') */
- if(E(_SaveMapTiles_read_anims(blk->window_id, &blk->tiles_data)))
- goto exit;
-
- /* Check animations */
- if(!check_animations(&blk->tiles_data))
- goto exit;
-
- /* Save to compressed Fednet file */
- {
- _kernel_oserror *err = perc_operation(FILEPERC_OP_COMP, save_to_file_block->filename, FILETYPE_MAPTILES, (flex_ptr)&blk->tiles_data);
- if(err != NULL)
- err_report(err->errnum, msgs_lookup_sub1("SaveFail", err->errmess));
- else
- flags = 1; /* success */
- }
-
- exit:
- saveas_file_save_completed(flags, id_block->self_id, save_to_file_block->filename);
- return 1; /* claim event */
- }
-
- /* ----------------------------------------------------------------------- */
-
- static int _SaveMapTiles_deletedhandler(int event_code, ToolboxEvent *event, IdBlock *id_block, void *handle)
- {
- SaveMapTilesData *blk = (SaveMapTilesData *)handle;
-
- /* Deregister handlers */
- RE(event_deregister_toolbox_handler(id_block->self_id, SaveAs_SaveToFile, _SaveMapTiles_savehandler, handle));
- RE(event_deregister_toolbox_handler(id_block->self_id, SaveAs_DialogueCompleted, delete_object_handler, handle));
- RE(event_deregister_toolbox_handler(blk->window_id, ActionButton_Selected, _SaveMapTiles_buttonshandler, handle));
- RE(event_deregister_toolbox_handler(blk->window_id, NumberRange_ValueChanged, _SaveMapTiles_bumphandler, handle));
- RE(event_deregister_toolbox_handler(id_block->self_id, Toolbox_ObjectDeleted, _SaveMapTiles_deletedhandler, handle));
-
- RE(loader_deregister_listener(FILETYPE_TEXT, blk->window_id, NULL));
-
- /* Remove from iconbar menu */
- RE(ViewsMenu_remove(id_block->self_id));
-
- /* free memory */
- flex_free((flex_ptr)&blk->tiles_data);
- free(blk->reset_file_name);
- free(blk);
-
- if(last_savebox == id_block->self_id)
- last_savebox = NULL_ObjectId;
-
- return 1; /* claim event */
- }
-
- /*
- * Loader handlers
- */
-
- static void _SaveMapTiles_animsloaded(char *title, bool data_saved, flex_ptr buffer, int filetype, void *handle)
- {
- /* Fill textfields with animations data */
- SaveMapTilesData *blk = (SaveMapTilesData *)handle;
-
- RE(_SaveMapTiles_write_anims(blk->window_id, (SF_MapTilesSetHdr **)buffer));
-
- flex_free(buffer);
- }
-